#ifndef _UTILS_H_
#define _UTILS_H_

#include <stdlib.h>

#define MAX(x, y) ((x>y)?x:y)

/// \param d Vector of values
/// \param n Vector size
/// \param m Vector Mean
double standard_deviation(double *d, int n, double mean);

/// \param x Seed utilizada - Use o valor de retorno como proxima seed
/// \return Retorna um numero aleatorio a partir de uma seed
inline unsigned long random_ul(unsigned long x);

/// \param x Variavel que guarda o estado do gerador
/// \return Retorna um numero aleatorio entre 0 e 1
inline double random0_1(unsigned long *x);

struct BoxMullerState
{
        double x1, x2, w, y1, y2;
        int useLast;
        struct drand48_data random;
};

/// \brief Inicia um estado Box Muller para gerar numeros aleatorios com dist. normal
/// \param state Ponteiro para um BoxMullerState
void initBoxMullerState(struct BoxMullerState* state);

/// \brief Gera um numero aleatorio com distribuicao normal.
/// \param state Estado utilizado para gerar o numero aleatorio
double boxMullerRandom(struct BoxMullerState* state);

#endif
